#ifndef MUNDO_H
#define	MUNDO_H

#include "Nivel.h"
#include "ISerializable.h"
#include "Excepcion.h"

using namespace TP;
using namespace TP::Serializacion;

namespace TP {    namespace Juego {

    class Mundo : public ISerializable {
    public:
        Mundo();

        Mundo(const string& pNombre);

        ~Mundo();

        void setNombre(const string& nombre);

        void setCantidadJugadores(unsigned cantidad);

        const string& getNombre() const;

        unsigned getCantidadJugadores() const;
            
        unsigned getCantidadNiveles() const;
        
        /* Retorna NULL si el nivel no existia */
        Nivel* getNivel(unsigned idNivel);

        /* Crea un nivel. Si ya existia un nivel con ese id, se elimina y
         * se reemplaza por uno nuevo */
        void crearNivel(unsigned id, unsigned anchura, unsigned altura,
                unsigned tiempo, const std::string &rutaImagenFondo);

        void addNivel(Nivel *nivel);

        /* Retorna false si no existia un nivel con ese id */
        bool removerNivel(unsigned id);

        bool operator==(const Mundo &mundo);

        bool operator!=(const Mundo &mundo);

        virtual string aXML();

        virtual string aXML(const string& pPath);

        virtual void parseXML(const string& pDescriptor);

        virtual TiXmlElement* aElementoXML();

        virtual void deElementoXML(TiXmlElement* pElemento);

        static Mundo* crearDeXML(const string& pDescriptor) throw (Excepcion&);

    private:
        /* Retorna -1 si no existia el nivel con ese id */
        int obtenerPosicionNivel(unsigned idNivel);

        string _nombre;
        unsigned _cantidadJugadores;
        std::vector<Nivel*> _niveles;
    };
}}

#endif	/* MUNDO_H */